import org.apache.spark.sql.{SparkSession, Dataset, Row, SaveMode}
import org.apache.spark.sql.Encoders

// 定义 Person 样例类（Scala 推荐使用 case class）
case class Person(id: Int, name: String)

// 打包成jar，提交spark任务不能正常运行。报无法加载 ParquetEncryptionApp 类错误
// 本地倒是可以直接运行，注意spark sdk版本记得选2.12.15 别选3.5的会不兼容
object ParquetEncryptionApp {
  def main(args: Array[String]): Unit = {
    // 1. 初始化 SparkSession（本地模式 + Parquet 加密配置）
    val spark = SparkSession.builder()
      .appName("ParquetEncryptionAppScala")
      // .master("local[*]")  // 本地运行
      .config("spark.hadoop.parquet.encryption.kms.client.class", "InMemoryKMS")
      .config("spark.hadoop.parquet.encryption.key.list",
        "footerKey:AAECAwQFBgcICQoLDA0ODw==, columnKey:AAECAwQFBgcICQoLDA0ODw==")
      .config("spark.hadoop.parquet.crypto.factory.class",
        "org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory")
      .getOrCreate()

    import spark.implicits._  // 启用 DSL 语法（如 $"column"）

    // 2. 创建示例数据（使用 case class + toDF）
    val data = Seq(
      Person(11, "Alice"),
      Person(21, "Bob")
    ).toDF("id", "name")  // 直接转换为 DataFrame

    data.show()

    // 3. 保存为加密的 Parquet 文件
    val destTable = "wx_encrypted_people_1"
    data.write
      .option("parquet.encryption.footer.key", "footerKey")
      .option("parquet.encryption.column.keys", "columnKey:id,name")
      .mode(SaveMode.Append)
      .parquet(destTable)
    println(s"加密文件已保存到: $destTable")
    // 5. 关闭 Spark
    spark.stop()
  }
}